/**
 * @file Snake.h
 * @author Lost
 * @date 五月 2018
 * @brief 
 * 蛇
 */

#ifndef __SNAKE_H__
#define __SNAKE_H__

#include "FrameData.h"
#include <vector>


using namespace std;
class CFrame;
class CStrategy;

/**
 * @brief 蛇
 */
class CSnake
{
public:
    CSnake(CFrame *pFrame);
    ~CSnake();

public:
    /**
     * @brief 刷新蛇
     */
    EMapUnitType MoveSnake(EDirType eDir);

    /**
     * @brief 初始化
     */
    bool Init(vector<Pos> &vecPos);

    /**
     * @brief 设置策略
     */
    void SetStrategy(CStrategy *pStrategy);

    /**
     * @brief 移动
     */
    EDirType MoveSnake();
public:

    /**
     * @brief 获取蛇头位置
     */
    inline const Pos &GetSnakeHead()const { return m_stSnake.stBody[0]; }

    /**
     * @brief 获取蛇尾位置
     */
    inline const Pos &GetSnakeTail()const { return m_stSnake.stBody[m_stSnake.iLength - 1]; }

    /**
     * @brief 获取蛇位置
     */
    inline const Pos *GetSnake()const { return m_stSnake.stBody; }

    /**
     * @brief 修改蛇位置
     */
    inline Pos *MutableSnake() { return m_stSnake.stBody; }

    /**
     * @brief 获取蛇长度
     */
    inline int GetSnakeLength()const { return m_stSnake.iLength; }

    /**
     * @brief 增加蛇长度
     */
    inline void IncreaseSnakeLength() { ++m_stSnake.iLength; }
private:
    /*!< 蛇 */
    SnakeData m_stSnake;

    /*!< 框架 */
    CFrame *m_pFrame;

    /*!< 策略 */
    CStrategy *m_pStrategy;
};

#endif